/**
 * 游戏命令处理器
 * 通过构造函数注入游戏属性，通过accept方法处理命令转换
 * 优先级设置为最高，确保最先被初始化和执行
 */
export class gameHandler extends plugin {
  constructor(e) {
    super({
      name: '游戏命令处理',
      dsc: '处理游戏相关命令前缀转换',
      event: 'message',
      priority: -9999, // 最高优先级
      rule: []
    })
    
    // 星铁命令正则
    this.srReg = /^#?(\*|星铁|星轨|穹轨|星穹|崩铁|星穹铁道|崩坏星穹铁道|铁道)+/
    // 绝区零命令正则  
    this.zzzReg = /^#?(%|％|绝区零|绝区)+/
  }

  /**
   * 初始化游戏属性
   * 使用 getter/setter 动态绑定到 e.game
   */
  initGameProperties(e) {
    // 初始化默认游戏
    e.game = 'gs'
    
    // 定义 isSr 属性
    Object.defineProperty(e, 'isSr', {
      get: () => e.game === 'sr',
      set: v => {
        e.game = v ? 'sr' : 'gs'
      },
      configurable: true,
      enumerable: true
    })
    
    // 定义 isGs 属性
    Object.defineProperty(e, 'isGs', {
      get: () => e.game === 'gs',
      set: v => {
        e.game = v ? 'gs' : 'sr'
      },
      configurable: true,
      enumerable: true
    })
    
    // 定义 isZzz 属性
    Object.defineProperty(e, 'isZzz', {
      get: () => e.game === 'zzz',
      set: v => {
        e.game = v ? 'zzz' : 'gs'
      },
      configurable: true,
      enumerable: true
    })
  }

  /**
   * accept 方法在所有插件规则匹配之前执行
   * 用于预处理消息，转换游戏命令前缀
   */
  async accept(e) {
    // 跳过非消息事件
    if (!e.msg) return false
    if (e && !Object.prototype.hasOwnProperty.call(e, 'game')) {
      this.initGameProperties(e)
    }
    // 检测并处理星铁命令
    if (this.srReg.test(e.msg)) {
      e.game = 'sr'
      e.msg = e.msg.replace(this.srReg, '#星铁')
      logger.debug(`[游戏命令处理] 转换星铁命令: ${e.msg}`)
    } 
    // 检测并处理绝区零命令
    else if (this.zzzReg.test(e.msg)) {
      e.game = 'zzz'
      e.msg = e.msg.replace(this.zzzReg, '#绝区零')
      logger.debug(`[游戏命令处理] 转换绝区零命令: ${e.msg}`)
    }
    
    // 返回 false 继续执行其他插件
    return false
  }
}